package nan.use_of_method;

import java.util.Scanner;

public class Main {
    //用循环的方法求斐波那契数列
   public static int fib(int n){//定义fib方法求斐波那契
       int f1=1;//定义第一项为1
       int f2=1;//定义第二项为1
       int f3=0;//先将第三项定为0
       for(int i=3;i<=n;i++){//for循环，进行加和交换数据
           // 第z三项和为第1+第2项，再把第二项的值给第一项，第三项和的值再给第二项，
           // 再继续相加
           f3=f1+f2;//f3永远充当前两个数之和
           f1=f2;
           f2=f3;
       }
       return f3;//返回想得到的第三项结果
   }

    public static void main16(String[] args) {
        System.out.println(fib(4));//调用fib方法，求第50项
    }
    /*
     写一个递归方法，输入一个非负整数，返回组成它的数字之和. 例如，输入 1729, 则应该返回1+7+2+9，
它的和是19
     */
    public static int func(int n){
        if(n<10){
            return n;
        }
        return n%10+func(n/10);
    }

    public static void main14(String[] args) {
        int m=2;
        System.out.println(func(m));
    }
    /*
    1+2+3+4+n的和
     */
    public static int add(int n){//n+sum（n-1）递推公式
        if(n==1){
            return 1;//趋近于终止的条件
        }
        return n+add(n-1);//自己调用自己
    }
    public static void main13(String[] args) {
        int x=4;
        System.out.println(add(x));//调用add，接收return
    }
    /*
     按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)
     */
    public static void func1(int n){
      if(n>9){//假设输入1234,1234>9,执行1234/10，n为123,123/10，n为12,12/10，n为1，
          //小于9了，由此递的过程结束，再每次回过来%10，趋近于终止的条件
           func1(n/10);//123也好，1234也好，代码只执行到这一步//n/10为形参
      }
        System.out.println(n%10+" ");//对于12来说，这一步还没有执行
    }
    public static void main(String[] args) {
        int x=1234;
          func1(x);
        //func(1234);
    }

        //递归写n！，思想：n!=n*(n-1)!
    public static int fac(int n){
        if(n == 1){
            return 1;//如果n=1就返回1
        }
        return n*fac(n-1);//如果n不等于1，那么n=n*(n-1)!，自己调用自己
    }
    public static void main11(String[] args) {

        System.out.println(fac(5));//调用fac方法
    }





    public static int add(int a,int b){//add函数，两个数字都为int型

        return(a+b);//返回a+b的和,类型为int
    }
    public static double add(double x,double y){

        return (x+y);//返回x+y的和，类型为double
    }
    public static void main10(String[] args) {
        int c=10;
        int d=20;//定义c和d将数据传给a和b
        int sum = add(c,d);//接收a和b的和
        System.out.println(sum);
        //System.out.println(add(c,d));
        double m=19.9;
        double n=10.1;
        System.out.println(add(m,n));
    }
    /*
    调整数组数据，使得奇数位于偶数之前
     */
     //定义一个数组，用i，j分别表示下标，i从前往后走，j从后往前走，i遇到偶数停下，
    // j遇到奇数停下，再交换两个数据
    public static void swapNum(int []array){
        int i=0;//i的下标是从数组第一个数据开始
        int j= array.length-1;//j的下标是从数组最后一个数据开始
        while(i<j && array[j]%2 == 0){//如果j所代表的数据取余2等于0，j所代表的偶数，
            // 继续往前走，但是i和j不能相遇，所以i<j
            j--;
        }
        while(i<j && array[i]%2 != 0){//i代表数据取余2不等于0，i代表奇数，
            // 继续往后走，同样i与j不能相遇
            i++;
        }
        int tmp=array[j];
        array[j]=array[i];
        array[i]=tmp;//交换数据
    }

    public static void main15(String[] args) {
        int[] array = {1, 2, 3, 4, 5};//定义数组
        swapNum(array);//调用swapNum函数
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
            //System.out.println(Arrays.toString(array));
        }//打印数组
    }
    /*
    两个数求和采用方法调用
     */
    public static int add1(int a, int b){
        int ret=a+b;
        return ret;
    }
    public static void main8(String[] args) {
        int x=10;
        int y=20;
        add1(x,y);//调用add方法
        int sum=add1(x,y);//接收ret
        System.out.println(sum);
        //add(20,10)
    }
    /*
    写一个函数返回参数二进制中 1 的个数 比如： 15 0000 1111 4 个,总共32位
     */
    public static void main7(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int num= scanner.nextInt();
        //将这个的每一位和1相与,如果结果为1，就证明该位为1，进行计数,再右移i次
        int count=0;
        for(int i=0;i<32;i++) {//总共循环31次
            if (((num >>i)& 1) != 0) {//右移i次之后，再与1相与；先判断最后一位，右移一次，判断倒数第二位
                count++;
            }
        }
        System.out.println(count);
    }
    /*
    输出一个整数的每一位
    123——>1 2 3 123%10=3  123/10=12   12%10=2   12/10=1  1%10=1
     */
    public static void main6(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int num=scanner.nextInt();
        while(num!=0){//当num不为0时，进入循环
            System.out.print(num%10+" ");//打印数字的最后一位数
            num=num/10;//num /= 10
        }
    }
    public static void main5(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int temp = scanner.nextInt();
        String str=String.valueOf(temp);
        int[] arrays=new int[str.length()];
        for(int i=0;i < str.length();i++){
            arrays[i]=Integer.parseInt(String.valueOf(str.charAt(i)));
        }
        int sum=0;
        for(int i=0;i<arrays.length;i++){
            sum=sum+arrays[i]*arrays[i]*arrays[i];
        }
        if(temp == sum){
            System.out.println("是水仙花数");
        }else {
            System.out.println("不是水仙花数");
        }
    }
    /*
    求出0～num之间的所有“水仙花数”并输出。
     */
    public static void main4(String[] args) {
        //1.首先判断当前数据是几位数，例如123,123/10=12,12/10=1,1/10=0,判断为3位数
        //2.求每一位的数字,并且求和，再判断和是否等于原来的数据
        Scanner scan = new Scanner(System.in);
        int num = scan.nextInt();//从键盘输入数据
        for(int i=0;i<=num;i++) {//找1-num之间的水仙花数
            int count=0;//记位数
            int tmp=i;//假设i=123；
            while (tmp != 0) {//用while循环实现判断当前数据的位数，当tmp不等于时count就会加一
                count++;
                tmp = tmp / 10;//但是执行完这一步i的值会变为0，// 所以定义一个tmp，让tmp的值是0
            }
            tmp=i;//再把i的值给tmp
            //求tmp的每一位并且计算和
            int sum=0;
            while(tmp!=0){//用while循环将每一位数据表达出，并且计算sum
                sum += Math.pow(tmp%10,count);//计算sum，通过Math.pow计算和，tmp%10表示
                tmp=tmp/10;
            }
            if(sum==i){
                System.out.println(i);
            }
        }
    }
    /*
    计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值。
     */
    public static void main3(String[] args) {
        //每一个数据都是有1/a组成，同时要注意正负号
        double sum=0;//定义和为sum，由于和一定为小数，使用double类型
        int b=1;//作用是变换数据的正负
        for(int a=1;a<=100;a++) {//用for循环表示a
            sum += 1.0 / a * b;//和为sum，每一个数据都乘b可以变换正负,注意要写成1.0
            b = -b;//b取反
        }
        System.out.println(sum);//输出sum
    }
    public static void main2(String[] args) {
        //用for循环写出i从1-9，再嵌套一个for循环表示j从1到9
        for(int i=1;i<=9;i++){//代表9行 一次循环代表一行
            for(int j=1;j<=i;j++){//代表列   第几行就有几列
                System.out.print(i+"*"+j+"="+i*j+" ");//打印i*j的值
            }
            System.out.println();//一次循环结束 说明进入下一行  换行
        }
    }
    /*
    main函数的参数是什么意思？
     */
    public static void main1(String[] args) {
        //从键盘输入数据
        Scanner scan = new Scanner(System.in);
        //int num = scan.nextInt();
        //判断是否为素数
        //[2,num)循环判断这个数据能不能整除
        for (int j = 1; j <= 100; j++) {//1-100之间的数据
            int i = 2;
            for (; i < j; i++) {//循环
                if (j % i == 0) {//判断能否整除i
                    System.out.println(j + "不是素数");//如果能整除就不为素数
                    break;//如果是素数，就不需要再判断，结束for循环
                }
            }
            if (j == i) {//num是素数或者是2
                if (j == 2) {//num是2时；
                    System.out.println(j + "既不是素数也不是质数");
                } else {//num不是2，说明为素数
                    System.out.println(j + "是素数");
                }
            }
        }
    }
}

